#include "MAX6675ISA.h"

/* GPIO控制宏 */
#define Kcouple_CS_ENABLE()  HAL_GPIO_WritePin(Kcouple_CS_PORT, Kcouple_CS_PIN, GPIO_PIN_RESET)
#define Kcouple_CS_DISABLE() HAL_GPIO_WritePin(Kcouple_CS_PORT, Kcouple_CS_PIN, GPIO_PIN_SET)
#define Kcouple_SCK_HIGH()   HAL_GPIO_WritePin(Kcouple_SCK_PORT, Kcouple_SCK_PIN, GPIO_PIN_SET)
#define Kcouple_SCK_LOW()    HAL_GPIO_WritePin(Kcouple_SCK_PORT, Kcouple_SCK_PIN, GPIO_PIN_RESET)
#define Kcouple_READ_SO()    HAL_GPIO_ReadPin(Kcouple_SO_PORT, Kcouple_SO_PIN)

/**
 * @brief  MAX6675初始化（GPIO和SPI配置）
 * @note   参考网页1和网页3的初始化逻辑
 */
void        Kcouple_Init(void) {}
static void Kcouple_DELAY_US(uint32_t us)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < us; i++)
    {
        for (j = 0; j < 8; j++)
        {
            __NOP();
        }
    }
};
/**
 * @brief  读取温度值
 * @param  temp: 温度输出指针
 * @retval 状态码（参考网页2和网页6的错误检测逻辑）
 */
Kcouple_Status Kcouple_ReadTemperature(float* temp)
{
    uint16_t rawValue = 0;
    uint8_t  bitCount = 16;
    Kcouple_SCK_LOW();

    Kcouple_CS_ENABLE();
    HAL_Delay(1);  // CS建立时间

    /* 逐位读取16位数据 */
    while (bitCount--)
    {
        Kcouple_SCK_HIGH();
        Kcouple_DELAY_US(1);  // 网页7的时序要求
        rawValue <<= 1;
        if (Kcouple_READ_SO() == GPIO_PIN_SET)
        {
            rawValue |= 0x01;
        }
        Kcouple_SCK_LOW();
        Kcouple_DELAY_US(1);
    }

    Kcouple_CS_DISABLE();

    /* 错误检测（D2位判断热电偶开路） */
    if (rawValue & 0x04)
    {
        return Kcouple_THERMOCOUPLE_OPEN;
    }

    /* 温度计算（12位分辨率，0.25℃/LSB） */
    *temp = (float)((rawValue >> 3) * 0.25f);
    return Kcouple_OK;
}

/**
 * @brief  独立片选控制函数
 * @param  state: 0-使能片选，1-禁用片选
 * @note   参考网页4的多设备扩展需求
 */
void Kcouple_CS_Control(uint8_t state)
{
    if (state == 0)
    {
        Kcouple_CS_ENABLE();
    }
    else
    {
        Kcouple_CS_DISABLE();
    }
}